package com.example.springshell.demo;

import org.springframework.shell.standard.ShellComponent;
import org.springframework.shell.standard.ShellMethod;
import org.springframework.shell.standard.ShellOption;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.Size;

/**
 * @description shell项目
 * @author maliqinag
 * @version 1.0
 * @date 2017年12月4日
 */
@ShellComponent
public class GreetingApp {

  /**
   * 在shell应用中，@ShellMethod标注的方法名称如果是全小写，则在程序启动使用shell命令时，指令也是小写，并和方法名一致；
   * 如果@ShellMethod标注的方法名为驼峰形式，则在执行指令命令时，指令为小写，单词之间用-隔开。如shutDown则为shut-down 参数值。
   *
   */

  @ShellMethod("sayhi")
  public String sayHello(String name) {
    return String.format("Hi %s", name);
  }

  @ShellMethod("valiparam")
  public String valiparam(int a, int b, int c) {
    return String.format("a = %d, b = %d, c = %d", a, b, c);
  }

  /**
   * @ShellOption 指定别名的处理方式
   * @param a
   * @param b 对b指定了别名boy，执行时只要指定--boy 参数值即可。
   * @param c
   * @return 返回指令执行结果
   */
  @ShellMethod(key = "other",value = "指定参数别名的指令,指令格式：other --a 参数值1 --boy 参数值2 --c 参数值3",prefix = "-")
  public String otherName( int a, @ShellOption("-boy") int b, int c) {
    return String.format("a = %d, b = %d, c = %d", a, b, c);
  }

  /**
   * 含有默认值的指令
   */
  @ShellComponent
  public class NameAndDefaultValueApp {
    @ShellMethod(key = "default", value = "With default value")
    public void withDefault(@ShellOption(defaultValue = "Hello") final String value) {
      System.out.printf("Value: %s%n", value);
    }
  }

  /**
   * @ShellOption 注解的arity属性可以使一个参数对应多个值
   * @param numbers
   * @return
   */
  @ShellMethod("Echo3")
  public String echo3(@ShellOption(arity = 3) int[] numbers) {
    return String.format("a = %d, b = %d, c = %d", numbers[0], numbers[1], numbers[2]);
  }

  /**布尔类型时，当参数出现时就为true
   * 参数是
   * @param param
   * @return
   */
  @ShellMethod(key = "success",value = "参数的类型是布尔类型时，当参数出现时就为true")
  public boolean success(boolean param){
    return param;
  }

  @ShellMethod("Terminate the system.")
  public String shutdown(boolean force) {
    return "You said " + force;
  }

  @ShellMethod("Terminate the system.")
  public String shutdown2(@ShellOption(arity=1, defaultValue="false") boolean force) {
    return "You said " + force;
  }
  /**
   * 包含参数校验的指令
   * @param number
   * @param name
   * @return
   */
  @ShellMethod("参数校验，number在10~100，name长度介于2-16之间")
  public String numberRange(@Min(10) @Max(100) int number,@Size(min = 3, max = 16) String name) {
    return String.format("The number is %s,Your name is %s", number,name);
  }

  /**
   * 自定义处理结果转换
   * @return
   */
  @ShellMethod("Result handler")
  public PrefixedResult resultHandler() {
    return new PrefixedResult("PRE", "Hello!");
  }
}